查看原文
其他

精通Linux系列八:文件属性

拾叁 更AI 2023-10-21

点击关注公众号,AI&编程干货及时送达   


文件属性

命令含义
stat显示文件和目录的属性。
wc计算文件的字节、单词和行数。
du测量文件和目录的磁盘使用情况。
file识别(猜测)文件的类型。
touch更改文件和目录的时间戳。
chown更改文件和目录的所有者。
chgrp更改文件和目录的群组所有权。
chmod更改文件和目录的保护模式。
umask为新文件和目录设置默认模式。
chattr更改文件和目录的扩展属性。
lsattr列出文件和目录的扩展属性。

当检查一个Linux文件时,要记住,内容只是一半。每个文件和目录也有描述其所有者,大小,访问权限和其他信息的属性。ls -l命令(参见[“基本文件操作”])显示了其中的一些属性,但其他命令提供了更多的信息。

stat

stdin  stdout  - file  -- opt  --help  --version

stat [选项] 文件

stat命令列出文件(默认)或文件系统(-f选项)的重要属性。文件信息如下:

→ stat myfile
  文件: ‘myfile’
  大小: 1168            块: 8
  IO 块: 4096  常规文件
设备: 811h/2065d      Inode: 37224455    链接: 1
访问: (0644/-rw-r--r--)  用户ID: ( 600/lisa)
  组ID: ( 620/users)
访问: 2015-11-07 11:15:14.766013415 -0500
修改: 2015-11-07 11:15:14.722012802 -0500
改变: 2015-11-07 11:15:14.722012802 -0500
 生日: -

这里包括文件名,以字节为单位的大小(1168),以块为单位的大小(8),文件类型(常规文件),八进制的权限(0644),“ls -l”格式的权限(-rw-r--r--),所有者的用户ID(600),所有者的名称(lisa),所有者的组ID(620),所有者的组名(users),设备类型(16进制的811,10进制的2065),inode编号(37224455),硬链接的数量(1),以及文件的最近访问、修改和状态更改的时间戳。文件系统信息如下:

→ stat -f myfile
  文件: "myfile"
    ID: f02ed2bb86590cc6 Namelen: 255
类型: ext2/ext3
块大小: 4096       基本块大小: 4096
块: 总数: 185788077  空闲: 108262724
  可用: 98819461
Inodes: 总数: 47202304   空闲: 46442864

这里包括文件名(myfile),文件系统ID(f02ed2bb86590cc6),该文件系统允许的文件名的最大长度(255字节),文件系统类型(ext),文件系统的块大小(4096),文件系统中的总块数、空闲块数和可用块数(分别为185788077,108262724和98819461),以及总的和空闲的inodes(分别为47202304和46442864)。

-t选项以单行的形式,无标题地呈现同样的数据。这对shell脚本或其他程序的处理很方便:

→ stat -t myfile
myfile 1168 8 81a4 600 620 811 37224455 1 0 0
  1446912914 1446912914 1446912914 0 4096
→ stat -tf myfile
myfile f02ed2bb86590cc6 255 ef53 4096 4096
  185788077 108262715 98819452 47202304 46442864

有用的选项

-L跟踪符号链接并报告它们指向的文件。
-f报告包含文件的文件系统,而不是文件本身。
-t简洁模式:在单行打印信息。

wc

stdin  stdout  - file  -- opt  --help  --version

wc [选项] [文件]

wc(词计数)程序打印(可能是)文本文件中的字节、单词和行数的计数:

→ wc myfile
  18  211 1168 myfile

这个文件有18行,211个由空格分隔的单词,以及1168字节。

有用的选项

-l仅打印行数。
-w仅打印单词数。
-c仅打印字节数。
-L找到每个文件中最长的行,并打印其字节长度。

du

stdin  stdout  - file  -- opt  --help  --version

du [选项] [文件| 目录]

du(磁盘使用情况)命令测量文件或目录占用的磁盘空间。默认情况下,它测量当前目录及其所有子目录,为每个目录打印总块数,并在底部打印总计:

→ du
36   ./Mail
340  ./Files/mine
40   ./Files/bob
416  ./Files
216  ./PC
2404 .

它也可以测量文件的大小:

→ du myfile emptyfile hugefile
4       myfile
0       emptyfile
18144   hugefile

有用的选项

-b以字节为单位测量使用情况。
-k以千字节为单位测量使用情况。
-m以兆字节为单位测量使用情况。
-B N以你定义的块显示大小,其中1块 = N 字节。(默认值 = 1024)
-h -H以人类可读的单位打印。例如,如果两个目录的大小分别为1G和25K,du -h 将打印1G和25K。-h选项使用1024的幂,而-H使用1000的幂。
-c在最后一行打印总数。当测量目录时,这是默认行为,但在测量单个文件时,如果你想要一个总数,就需要提供-c
-L跟踪符号链接,并测量它们指向的文件。
-s仅打印总大小。

file

stdin  stdout  - file*  -- opt  --help  --version

file [选项] 文件

file命令报告文件的类型。输出是根据文件内容和其他因素做出的猜测:

→ file /etc/hosts /usr/bin/who letter.docx
/etc/hosts:    ASCII 文本
/usr/bin/who:  ELF 64位 LSB 可执行程序...
letter.docx:   Microsoft Word 2007+(微软 Word 2007+)

有用的选项

-b省略文件名(输出的左列)。
-i为文件打印 MIME 类型,如“text/plain”或“audio/mpeg”,而不是通常的输出。
-f name_file从给定的 name_file 中读取文件名,每行一个,并报告它们的类型。之后,像往常一样处理命令行上的文件名。
-L跟踪符号链接,报告目标文件的类型而不是链接。
-z如果文件被压缩(参见[“文件压缩和打包”]),则查看未压缩的内容以确定文件类型,而不是报告“压缩数据”。

touch

stdin  stdout  - file*  -- opt  --help  --version

touch [选项] 文件

touch命令更改与文件关联的两个时间戳:它的修改时间(文件数据最后更改的时间)和它的访问时间(文件最后读取的时间)。要将这两个时间戳设置为现在,运行:

→ touch myfile

你可以将这些时间戳设置为任意值,例如:

→ touch -d "1975年11月18日" myfile

如果给定的文件不存在,touch会创建它,提供了一种方便的方式来创建空文件。

有用的选项

-a仅更改访问时间。
-m仅更改修改时间。
-c如果文件不存在,不创建它(通常,touch会创建它)。
-d timestamp设置文件的时间戳(timestamp)。可以接受大量的时间戳格式,从“12/28/2001 3pm”到“28-May”(默认为当前年份,时间为午夜)到“next tuesday 13:59”到“0”(今天的午夜)。可以试验并用stat检查你的工作。完整的文档可以从info touch获取。

chown

stdin  stdout  - file  -- opt  --help  --version

chown [options] user_spec files

chown(变更所有者)命令设置文件和目录的所有权。若要使用户“smith”成为几个文件和一个目录的所有者,运行:

→ sudo chown smith myfile myfile2 mydir

user_spec 参数可能是以下几种可能性:

  • • 一个存在的用户名(或任何数字用户ID),用来设置所有者:chown smith myfile

  • • 一个存在的用户名(或任何数字用户ID),可选地后跟一个冒号和一个存在的组名(或任何数字组ID),用来设置所有者和组:chown smith:users myfile

  • • 一个存在的用户名(或任何数字用户ID)后跟一个冒号,用来设置所有者将组设置为调用用户的登录组:chown smith: myfile

  • • 一个存在的组名(或任何数字组ID)前跟一个冒号,只设置组:chown :users myfile

  • • --reference=*file*用来设置与另一个给定文件相同的所有者和组

有用的选项

--dereference跟踪符号链接并操作它们指向的文件。
-R在目录层次结构中递归地改变权限。

chgrp

stdin  stdout  - file  -- opt  --help  --version

chgrp [options] group_spec files

chgrp(变更组)命令设置文件和目录的组所有权:

→ chgrp smith myfile myfile2 mydir

group_spec 参数可能是以下几种可能性:

  • • 组名或数字组ID

  • • --reference=*file*,设置与另一个给定文件相同的组所有权

请参阅[“组管理”]以获取有关组的更多信息。

有用的选项

--dereference跟踪符号链接并操作它们指向的文件。
-R在目录层次结构中递归地改变所有权。

chmod

stdin  stdout  - file  -- opt  --help  --version

chmod [options] permissions files

chmod(改变模式)命令通过设置访问权限,保护文件和目录不被同一系统上的未经授权的用户访问。典型的权限是读取、写入和执行,它们可以限制给文件所有者、文件的组所有者和/或其他用户。权限参数可以采取三种不同的形式:

  • • --reference=*file*,设置与另一个给定文件相同的权限。

  • • 一个最多四位数的八进制数,指定文件的绝对权限位,如[图6]。最左边的数字是特殊的(后面会描述),第二、第三和第四分别代表文件的所有者、文件的组和所有用户。

  • • 一个或多个指定绝对或相对权限的字符串(即,相对于文件现有的权限)。例如,a+r使文件可以被所有用户读取。

最常见的权限是:

→ chmod 600 myfile     仅供你私人使用的文件
→ chmod 644 myfile     每个人都可以读取;你可以写入
→ chmod 700 mydir      仅供你私人使用的目录
→ chmod 755 mydir      每个人都可以读取;你可以写入
image-20230725210542040

图6. 文件权限位解释

在第三种形式中,每个字符串由三部分组成:

  • • 范围 (可选)u 代表用户,g 代表组,o 代表不在组中的其他用户,a 代表所有用户。默认是 a

  • • 命令+ 用于添加权限; 用于删除权限;或 = 用于设置绝对权限,忽略现有的权限。

  • • 权限r 代表读取,w 代表写入/修改,x 代表执行(对于目录,这是允许 cd 进入目录的权限),X 代表条件执行(稍后解释),u 代表复制用户权限,g 代表复制组权限,o 代表复制“其他用户”的权限,s 代表设置用户ID或组ID,t 代表粘性位。

例如,ug+rw 会为用户和组添加读写权限,a-x(或者只用 -x)会移除所有人的执行权限,o=r 会直接把“其他用户”的权限设置为只读。你可以用逗号隔开这些字符串来组合它们,比如 ug+rw,a-x

条件执行权限(X)的含义与 x 相同,除非文件已经是可执行的,或者文件是一个目录,否则它不会起作用。

设置用户ID和设置组ID,当应用于可执行文件(程序和脚本)时,会产生强大的效果。假设我们有一个可执行文件 F,由用户“smith”和组“friends”拥有。如果文件 F 启用了设置用户ID,那么任何运行 F 的人都会“变成”用户“smith”,拥有她所有的权利和特权,直到程序结束。同样,如果 F 启用了设置组ID,任何执行 F 的人在程序运行期间都会成为“friends”组的成员。你可以想象,设置用户ID和设置组ID可能会影响系统的安全,所以除非你真正知道自己在做什么,否则不要使用它们。一个不小心的 chmod +s 可能会使你的整个系统面临攻击。

粘性位,最常用于 /tmp 目录,控制该目录中文件的移除。通常,如果你在一个目录中有写权限,你可以删除或移动它内部的文件,即使你没有这些文件本身的访问权限。在设置了粘性位的目录内,你需要对文件有写权限才能删除或移动它。

有用的选项

-R在目录层级中递归地改变所有权。


umask

stdin  stdout  - file  -- opt  --help  --version

umask [选项] [掩码]

umask 命令设置或显示你创建文件和目录的默认模式 - 是否可由你自己、你的组和全世界进行读取、写入和/或执行:

→ umask
0002
→ umask -S
u=rwx,g=rwx,o=rx

首先让我们进行一些技术性的讨论,然后给出一些常识性的建议。umask是一个二进制(基数为2)值,尽管它通常以八进制(基数为8)的形式呈现。它通过使用二进制操作 NOT AND 与文件的八进制值0666和目录的八进制值0777组合来定义你的默认保护模式。例如,umask 0002产生了一个默认的文件模式0664:

0666 NOT AND 0002
= 000110110110 NOT AND 000000000010
= 000110110110 AND 111111111101
= 000110110100
= 0664

类似地,对于目录,0002 NOT AND 0777 产生一个默认模式0775。

如果这个解释看起来像是来自外太空,这里有一些简单的配方。使用掩码0022给自己全部权限,给其他人只给读/执行权限:

→ umask 0022
→ touch newfile && mkdir dir
→ ls -ldG newfile dir
-rw-r--r--  1 smith      0 Nov 11 12:25 newfile
drwxr-xr-x  2 smith   4096 Nov 11 12:25 dir

使用掩码0002给自己和你的默认组全部权限,并给其他人读/执行权限:

→ umask 0002
→ touch newfile && mkdir dir
→ ls -ldG newfile dir

-rw-rw-r--  1 smith      0 Nov 11 12:26 newfiledrwxrwxr-x  2 smith   4096 Nov 11 12:26 dir

使用掩码0077以给自己全部权限,其他人无任何权限:

→ umask 0077
→ touch newfile && mkdir dir
→ ls -ldG newfile dir
-rw-----  1 smith      0 Nov 11 12:27 newfile
drwx----  2 smith   4096 Nov 11 12:27 dir

chattr

stdin  stdout  - file  -- opt  --help  --version

chattr [options] [+ − =]attributes [files]

如果你曾使用过其他Unix系统,你可能会对Linux文件可以具有超出访问权限的额外属性感到惊讶。如果文件位于"ext"文件系统(ext2、ext3等),你可以使用chattr(更改属性)命令设置这些扩展属性,并使用lsattr列出它们。

chmod一样,属性可以相对地添加(+)或移除(-),或绝对地设置(=)。例如,要保持文件被压缩和不可转储,运行:

→ chattr +cd myfile
属性( Attribute )含义( Meaning )
a仅添加:只允许向此文件追加内容,但不能以其他方式编辑。仅root用户可以。
A不标记访问:访问此文件不会更新其访问时间戳(atime)。
c压缩:写入时数据透明压缩,读取时解压。
d不转储:告诉dump程序在备份时忽略此文件(参见["备份和远程存储"])。
i不可变:文件不能被更改或删除(仅root)。
j记录数据(仅限ext3文件系统)。
s安全删除:如果删除,此文件的数据将被零覆盖。
S同步更新:更改立即写入磁盘。
u不可删除:文件无法被删除。

还有一些其他属性,其中一些是模糊的或实验性的。详情请查看manpage。

有用的选项

-R递归处理目录。

lsattr

stdin  stdout  - file  -- opt  --help  --version

lsattr [options] [files]

如果你使用chattr设置了扩展属性,你可以使用lsattr(列出属性)查看它们。输出使用与chattr相同的字母;例如,此文件是不可变的和不可删除的:

→ lsattr myfile
-u--i``` myfile

如果没有指定文件,lsattr将打印当前目录中所有文件的属性。

有用的选项

-R递归处理目录。
-a列出所有文件,包括那些名字以点开始的文件。
-d如果列出的是一个目录,不列出其内容,只列出目录本身。

推荐阅读

··································

你好,我是拾叁,7年开发老司机、互联网两年外企5年。怼得过阿三老美,也被PR comments搞崩溃过。这些年我打过工,创过业,接过私活,也混过upwork。赚过钱也亏过钱。一路过来,给我最深的感受就是不管学什么,一定要不断学习。只要你能坚持下来,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯和编程知识,帮你积累弯道超车的资本。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存